package com.zf.jdk_new;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Map;
import java.util.stream.Stream;

/**
 * LTS
 * Jdk11新特性正式版：
 * - 新的字符串API
 * - 增强的 try with resource
 * - 新的 文件API
 * - var 增强，lambda参数使用 var
 * - javac和java命令合并为java命令，"java Jdk11Test.java" 便可执行
 * - 移除JavaEE和CORBA模块
 */
public class Jdk11Release {
    public static void main(String[] args) throws IOException {
        testNewStringApi();
        System.out.println("============");
        testNewTry();
        System.out.println("============");
        testNewFileApi();
        System.out.println("============");
        testVarLambda();
    }

    /**
     * 新的字符串API
     */
    public static void testNewStringApi() {
        //字符串新增API
        System.out.println("".isBlank()); // true
        // 去除两端的空白字符，遇到非空白的就停止：空格、回车、换行、制表等空白字符
        System.out.println("\n   java t \n".strip()); // "java t"
        // 从尾部开始去除空白字符
        System.out.println("    java t\n ".stripTrailing()); // "    java t"
        // 从头部开始去除空白字符
        System.out.println("\n   t java  ".stripLeading()); // "t java  "
        // 复制指定次数的字符串
        System.out.println("java".repeat(3)); // "javajavajava"
        // lines() 按照 \n, \r, \r\n 分割字符串得到流
        Stream<String> stream = "a\r\nb\r\nc".lines();
        stream.forEach(System.out::println);
    }

    /**
     * 增强的 try with resource
     */
    public static void testNewTry() throws FileNotFoundException {
        //try-with-resource 增强
        String dir = System.getProperty("user.dir");
        // 旧写法的 try with resource
        try (
                FileReader reader = new FileReader(dir + "/src/main/java/com/zf/jdk_new/test.txt");
                FileReader reader2 = new FileReader(dir + "/src/main/java/com/zf/jdk_new/test2.txt")
        ) {
            System.out.println(reader.getEncoding());
            System.out.println(reader2.ready());
        } catch (IOException ignored) {

        }
        // 新写法的  try with resource
        FileReader reader = new FileReader(dir + "/src/main/java/com/zf/jdk_new/test.txt");
        FileReader reader2 = new FileReader(dir + "/src/main/java/com/zf/jdk_new/test2.txt");
        try (reader; reader2) {
            System.out.println(reader.getEncoding());
            System.out.println(reader2.ready());
        } catch (IOException ignored) {

        }
    }

    /**
     * 新的 文件API
     */
    public static void testNewFileApi() throws IOException {
        // 创建一个临时文件，不用指定目录
        Path tempFile = Files.createTempFile("temp", ".txt");
        // writeString 直接写入字符串
        Files.writeString(tempFile, "你好", StandardCharsets.UTF_8, StandardOpenOption.WRITE);
        //readString 读取文件中的所有内容并转换成字符串返回
        String res = Files.readString(tempFile);
        System.out.println(res);
    }

    /**
     * var 增强，lambda参数使用 var。
     * lambda参数要么全都使用var,要么都不使用var,不能 具体类型和var关键字 混用
     */
    public static void testVarLambda() {
        Map<String, String> map = Map.of("name", "ere");
        map.forEach((var k, var v)->{
            System.out.printf("%s : %s\n", k, v);
        });

        map.forEach((k, v)->{
            System.out.printf("%s : %s\n", k, v);
        });

        // // 报错
        // map.forEach((String k, var v)->{
        //     System.out.printf("%s : %s\n", k, v);
        // });
    }

}
